import java.util.Arrays;
import java.util.Comparator;

/**
 * 排序法：
 * 1.冒泡排序：适用小规模数据
 * 2.选择排序：适用大规模数据
 * 3.插入排序：适用小规模数据
 * 4.快速排序：适用大规模数据
 * 5.归并排序：适用大规模数据
 * 6.其他常见排序
 * 实际开发中适用java内置的Arrays.sort（），无需重复造轮子
 */
public class PracticsSort {
    public static void main(String[] args) {
        int[] arr = {2, 4, 9, 5, 7, 3, 1};
        //  bubbleSort(arr);
        //   bubbleSortOri(arr);
        //   bubbleSortDesOri(arr);
        for (int i : arr) {
            System.out.println(i);
        }

        User[] users = {
                new User("Alice", 23),
                new User("Bob", 21),
                new User("Lily", 24)

        };

        Arrays.sort(users);

        Arrays.sort(users, Comparator.comparingInt(u->u.getAge()));//按年龄排序，定制排序，不影响原类
        for (User user : users) {
            System.out.println("名称 " + user.getName() + "    年龄 " + user.getAge());
        }
    }

    /**
     * 改良版冒泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i + 1 < arr.length; i++) {//排序的轮次，每排一次就把最大的值放到最后。i=0时，找到最大的一个值，放到最后的位置。i=1时，找到次大的一个值，放到倒数第二个位置。依次类推。
            for (int j = 0; j + 1 < arr.length - i; j++) {//这个是做两两相邻数据排序的。-----这里j+1<arr.length-i的原因是最后i个位置的数据已经排序了，需要排除i后面的数据。
                if (arr[j + 1] < arr[j]) {
                    int tmp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = tmp;
                }
            }


        }

    }

    /**
     * 原始版冒泡排序-升序,未经改良
     */
    public static void bubbleSortOri(int[] arr) {
        for (int i = 0; i + 1 < arr.length; i++) {
            for (int j = 0; j + 1 < arr.length; j++) {
                if (arr[j + 1] < arr[j]) {
                    int tmp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = tmp;
                }
            }


        }

    }

    /**
     * 原始版冒泡排序-降序,未经改良
     */
    public static void bubbleSortDesOri(int[] arr) {
        for (int i = 0; i + 1 < arr.length; i++) {
            for (int j = 0; j + 1 < arr.length; j++) {
                if (arr[j + 1] > arr[j]) {
                    int tmp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = tmp;
                }
            }


        }

    }
/**
 * 1.基本类型数据排序用Arrays.sort()
 * 2.对于自定义对象排序，使用比较器指定排序规则，两种方式：1.让类实现comparable接口 2.使用Comparator接口（定制排序）
 * 3.集合List，Set排序
 * List排序：使用Collections.sort()或List.sort()（Java 8+），原理同对象数组排序。
 * Set排序：使用TreeSet（自动按Comparable或Comparator排序），或先转为List再排序。
 */


}
